#ifndef __CRYPTO_H_
#define __CRYPTO_H_

typedef enum{
	DES_ECB =0,
	DES_CBC,
	DES3_ECB,
	DES3_CBC,
}CRYPTO_TYPE;


typedef enum{
	RESULT_TYPE_BIN =0,//bin类型
	RESULT_TYPE_STR_UPPER,//HEX大写字符串
	RESULT_TYPE_STR_LOWER,//HEX大写字符串
}MD5_RESULT_TYPE;


typedef enum{
	RESULT_OK = 0,
	RESULT_ERROR,
}CRYPTO_RESULT;

typedef enum{
    ENCRYPT = 0,
    DECRYPT,
}CRYPT_MODE;
#ifdef __cplusplus
extern "C" {
#endif

/*
	DES 加密
	type[in]:加密方式, DES_ECB,DES_CBC,DES3_ECB,DES3_CBC
	key[in] 秘钥 des 固定8位 3des可为8位 16位 24位
	keyLen[in] 秘钥长度，des固定为8,3des可为8 16 24
	vi[in] 偏移   固定8位， CBC方式可用,ECB 为null
	inData[in] 待加密数据
    inLen [in] 待加密数据长度
	outdata[out] 加密后数据(需要提前分配足够空间)
	outLen[out] 传出加密后数据长度
	return 是否成功
*/
CRYPTO_RESULT des_encode(CRYPTO_TYPE type, const unsigned char key[], unsigned char keyLen, const unsigned char vi[8], const unsigned char inData[],const int inLen,unsigned char *outData,int *outLen);

/*
	DES 解密
	type[in]:解密方式, DES_ECB,DES_CBC,DES3_ECB,DES3_CBC
	key[in] 秘钥 des 固定8位 3des可为8位 16位 24位
	keyLen[in] 秘钥长度，des固定为8,3des可为8 16 24
	vi[in] 偏移	固定8位， CBC方式可用,ECB 为null
	inData[in] 待解密数据
    inLen[in] 待解密数据长度
	outData[out] 解密后数据(需要提前分配空间)
	outLen[out] 传出解密后数据长度
	return 是否成功
*/
CRYPTO_RESULT des_decode(CRYPTO_TYPE type, const unsigned char key[], unsigned char keyLen, const unsigned char vi[8], const unsigned char inData[],const int inLen,unsigned char *out,int *outLen);

/*
	MD5 摘要
	inData[in] 待摘要数据
    inLen[in] 待摘要数据长度
	outData[out] 摘要后数据(需要分配空间16字节)
	return 是否成功
*/
CRYPTO_RESULT md5(const unsigned char inData[],int inLen,unsigned char *outData);

/*
	DES ECB方式加解密，固定处理8字节数据
    mode[in] 加/解密，ENCRYPT：加密，DECRYPT:解密
	inData[in] 待加/解密数据
    key[in] 8字节密钥
	outData[out] 解密后数据(需要提前分配空间,8字节)
*/
void des_ecb(CRYPT_MODE mode, unsigned char inData[], unsigned char key[], unsigned char* outData);
#ifdef __cplusplus
}
#endif
#endif
